this._updateIconBoxClip();
},
+ _syncIcon: function() {
+ let icon = this._targetApp.get_faded_icon(2 * PANEL_ICON_SIZE, this._iconBox.text_direction);
+ this._iconBox.set_child(icon);
+ },
+
_onIconThemeChanged: function() {
if (this._iconBox.child == null)
return;
- this._iconBox.child.destroy();
- let icon = this._targetApp.get_faded_icon(2 * PANEL_ICON_SIZE);
- this._iconBox.set_child(icon);
+ this._syncIcon();
},
_updateIconBoxClip: function() {
}
this._targetApp = targetApp;
- let icon = targetApp.get_faded_icon(2 * PANEL_ICON_SIZE);
-
this._label.setText(targetApp.get_name());
this.setName(targetApp.get_name());
- this._iconBox.set_child(icon);
+ this._syncIcon();
this._iconBox.show();
if (targetApp.get_state() == Shell.AppState.STARTING ||
typedef struct {
ShellApp *app;
int size;
+ ClutterTextDirection direction;
} CreateFadedIconData;
static CoglHandle
guint8 n_channels;
gboolean have_alpha;
gint fade_start;
- gint fade_range;
+ gint fade_end;
guint i, j;
guint pixbuf_byte_size;
guint8 *orig_pixels;
pixels = g_malloc0 (rowstride * height);
memcpy (pixels, orig_pixels, pixbuf_byte_size);
- fade_start = width / 2;
- fade_range = width - fade_start;
- for (i = fade_start; i < width; i++)
+ /* fade on the right side for LTR, left side for RTL */
+ if (data->direction == CLUTTER_TEXT_DIRECTION_LTR)
+ {
+ fade_start = width / 2;
+ fade_end = width;
+ }
+ else
+ {
+ fade_start = 0;
+ fade_end = width / 2;
+ }
+
+ for (i = fade_start; i < fade_end; i++)
{
for (j = 0; j < height; j++)
{
guchar *pixel = &pixels[j * rowstride + i * n_channels];
- float fade = 1.0 - ((float) i - fade_start) / fade_range;
+ float fade = ((float) i - fade_start) / (fade_end - fade_start);
+ if (data->direction == CLUTTER_TEXT_DIRECTION_LTR)
+ fade = 1.0 - fade;
pixel[0] = 0.5 + pixel[0] * fade;
pixel[1] = 0.5 + pixel[1] * fade;
pixel[2] = 0.5 + pixel[2] * fade;
* shell_app_get_faded_icon:
* @app: A #ShellApp
* @size: Size in pixels
+ * @direction: Whether to fade on the left or right
*
* Return an actor with a horizontally faded look.
*
* Return value: (transfer none): A floating #ClutterActor, or %NULL if no icon
*/
ClutterActor *
-shell_app_get_faded_icon (ShellApp *app, int size)
+shell_app_get_faded_icon (ShellApp *app, int size, ClutterTextDirection direction)
{
CoglHandle texture;
ClutterActor *result;
/* Use icon: prefix so that we get evicted from the cache on
* icon theme changes. */
- cache_key = g_strdup_printf ("icon:%s,size=%d,faded", shell_app_get_id (app), size);
+ cache_key = g_strdup_printf ("icon:%s,size=%d,faded-%s",
+ shell_app_get_id (app),
+ size,
+ direction == CLUTTER_TEXT_DIRECTION_RTL ? "rtl" : "ltr");
data.app = app;
data.size = size;
+ data.direction = direction;
texture = st_texture_cache_load (st_texture_cache_get_default (),
cache_key,
ST_TEXTURE_CACHE_POLICY_FOREVER,
GDesktopAppInfo *shell_app_get_app_info (ShellApp *app);
ClutterActor *shell_app_create_icon_texture (ShellApp *app, int size);
-ClutterActor *shell_app_get_faded_icon (ShellApp *app, int size);
+ClutterActor *shell_app_get_faded_icon (ShellApp *app, int size, ClutterTextDirection direction);
const char *shell_app_get_name (ShellApp *app);
const char *shell_app_get_description (ShellApp *app);
gboolean shell_app_is_window_backed (ShellApp *app);